home *** CD-ROM | disk | FTP | other *** search
/ APDL Other Worlds / APDL Other Worlds Collection.iso / SF3000 / Extras / !SFtoSpr / c / SaveDir < prev    next >
Encoding:
Text File  |  2003-11-06  |  8.3 KB  |  254 lines

  1. /*
  2.  *  SFtoSpr - Star Fighter 3000 graphics converter
  3.  *  Directory savebox
  4.  *  Copyright (C) 2000  Chris Bazley
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public Licence as published by
  8.  *  the Free Software Foundation; either version 2 of the Licence, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public Licence for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public Licence
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20.  
  21. /* ANSI library files */
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include <stdbool.h>
  26.  
  27. /* RISC OS library files */
  28. #include "wimp.h"
  29. #include "toolbox.h"
  30. #include "event.h"
  31. #include "wimplib.h"
  32. #include "saveas.h"
  33. #include "window.h"
  34. #include "gadgets.h"
  35. #include "flex.h"
  36.  
  37. /* My library files */
  38. #include "err.h"
  39. #include "msgtrans.h"
  40. #include "hourglass.h"
  41. #include "Loader.h"
  42. #include "Macros.h"
  43. #include "ViewsMenu.h"
  44. #include "TboxBugs.h"
  45.  
  46. /* Local headers */
  47. #include "Scan.h"
  48. #include "SaveDir.h"
  49. #include "Utils.h"
  50. #include "Main.h"
  51.  
  52. /* Gadget IDs */
  53. #define SAVEDIR_RADIO_TOSF3000   0x01
  54. #define SAVEDIR_RADIO_TOSPRITES  0x0c
  55.  
  56. typedef struct _SaveDirData
  57. {
  58.   ObjectId    saveas_id;
  59.   ObjectId    window_id;
  60.   char       *input_path;
  61. #ifndef SAVEAS_CRAP
  62.   char       *reset_file_name;
  63. #endif
  64.   ComponentId reset_direction;
  65. } SaveDirData;
  66.  
  67. /* ----------------------------------------------------------------------- */
  68. /*                       Function prototypes                               */
  69.  
  70. static ToolboxEventHandler _SaveDir_deletedhandler, _SaveDir_savehandler, _SaveDir_buttonshandler;
  71.  
  72. /* ----------------------------------------------------------------------- */
  73. /*                         Public functions                                */
  74.  
  75. ObjectId SaveDir_create(char *inputpath)
  76. {
  77.   SaveDirData *newblk;
  78.  
  79.   /* Grab memory */
  80.   newblk = malloc(sizeof(SaveDirData));
  81.   if(newblk == NULL)
  82.     MG_RETV("NoMem", NULL_ObjectId) /* failure */
  83.  
  84.   newblk->input_path = copystring(inputpath);
  85.   if(newblk->input_path == NULL)
  86.     goto errexit1;
  87. #ifndef SAVEAS_CRAP
  88.   newblk->reset_file_name = NULL;
  89. #endif
  90.   /* Create object */
  91.   if(E(toolbox_create_object(0, "SaveDir", &newblk->saveas_id)))
  92.     goto errexit2;
  93.   if(E(saveas_get_window_id(0, newblk->saveas_id, &newblk->window_id)))
  94.     goto errexit3;
  95.  
  96.   /* Store default settings */
  97. #ifndef SAVEAS_CRAP
  98.   newblk->reset_file_name = copystring(inputpath);
  99.   if(newblk->reset_file_name == NULL)
  100.     goto errexit3;
  101. #endif
  102.   if(E(radiobutton_get_state(0, newblk->window_id, SAVEDIR_RADIO_TOSF3000, NULL, &newblk->reset_direction)))
  103.     goto errexit3;
  104.  
  105.   /* Add entry to iconbar menu */
  106.   if(E(ViewsMenu_add(newblk->saveas_id, msgs_lookup_sub1("DirDialogueList", tail(inputpath, 3)), inputpath)))
  107.     goto errexit3;
  108.  
  109.   /* Set up window */
  110.   if(E(saveas_set_file_name(0, newblk->saveas_id, inputpath))
  111.   || E(saveas_set_file_type(0, newblk->saveas_id, FILETYPE_DIR)))
  112.     goto errexit4;
  113.  
  114.   /* Register Toolbox event handlers
  115.      Note that ObjectDeleted handler is registered AFTER anything that could cause an error and therefore premature deletion!
  116. */
  117.   if(!E(event_register_toolbox_handler(newblk->saveas_id, SaveAs_SaveToFile,  _SaveDir_savehandler, newblk))
  118.   && !E(event_register_toolbox_handler(newblk->saveas_id, SaveAs_DialogueCompleted,  delete_object_handler, newblk))
  119.   && !E(event_register_toolbox_handler(newblk->window_id, ActionButton_Selected, _SaveDir_buttonshandler, newblk))
  120.   && !E(event_register_toolbox_handler(newblk->saveas_id, Toolbox_ObjectDeleted,  _SaveDir_deletedhandler, newblk)))
  121.     return newblk->saveas_id; /* success */
  122.  
  123.   errexit4:
  124.     RE(ViewsMenu_remove(newblk->saveas_id));
  125.   errexit3:
  126.     RE(toolbox_delete_object(0, newblk->saveas_id));
  127.   errexit2:
  128. #ifndef SAVEAS_CRAP
  129.     free(newblk->reset_file_name);
  130. #endif
  131.     free(newblk->input_path);
  132.   errexit1:
  133.     free(newblk);
  134.     return NULL_ObjectId; /* failure */
  135. }
  136.  
  137. /* ----------------------------------------------------------------------- */
  138. /*                         Private functions                               */
  139.  
  140. /*
  141.  * Toolbox event handlers
  142.  */
  143.  
  144. static int _SaveDir_buttonshandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
  145. {
  146.   ActionButtonSelectedEvent *abse = (ActionButtonSelectedEvent *)event;
  147.   SaveDirData *blk = (SaveDirData *)handle;
  148.  
  149.   if(!FLAG_SET(abse->hdr.flags, ActionButton_Selected_Adjust))
  150.     return 0; /* not interested */
  151.  
  152.   switch(id_block->self_component) {
  153.     case 0x82bc02: /* Cancel button */
  154.       /* Reset dbox state */
  155. #ifndef SAVEAS_CRAP
  156.       if(blk->reset_file_name != NULL)
  157.         RE(saveas_set_file_name(0, blk->saveas_id, blk->reset_file_name));
  158. #else
  159.       RE(saveas_set_file_name(0, blk->saveas_id, blk->input_path));
  160. #endif
  161.  
  162.       RE(radiobutton_set_state(0, id_block->self_id, blk->reset_direction, 1));
  163.       break;
  164.  
  165. #ifndef SAVEAS_CRAP /* no point saving state if dbox closes anyway */
  166.     case 0x82bc03: /* Save button */
  167.       /* Additional dbox state saving (radio buttons are read on save) */
  168.       int len;
  169.       E_RETV(saveas_get_file_name(0, blk->saveas_id, NULL, 0, &len), 1)
  170.       free(blk->reset_file_name);
  171.       blk->reset_file_name = malloc(len+1);
  172.       if(blk->reset_file_name == NULL)
  173.         err_complain(255, msgs_global("NoMem"));
  174.       else
  175.         RE(saveas_get_file_name(0, blk->saveas_id, blk->reset_file_name, len, NULL))
  176.       break;
  177. #endif
  178.  
  179.     default:
  180.       return 0; /* unknown component */
  181.   }
  182.  
  183.   return 1; /* claim event */
  184. }
  185.  
  186. /* ----------------------------------------------------------------------- */
  187.  
  188. static int _SaveDir_savehandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
  189. {
  190.   SaveAsSaveToFileEvent *save_to_file_block = (SaveAsSaveToFileEvent *)event;
  191.   SaveDirData *blk = (SaveDirData *)handle;
  192.   unsigned int flags = 0;
  193.  
  194.   /* For the moment we just create the root directory */
  195.   if(!ViewsMenu_strcmp_nc(save_to_file_block->filename, "<Wimp$Scrap>")) {
  196.     _kernel_osfile_block kosfb;
  197.     kosfb.start = 0; /* default number of entries */
  198.     if(_kernel_osfile(8, save_to_file_block->filename, &kosfb) == _kernel_ERROR) {
  199.       _kernel_oserror *e = _kernel_last_oserror();
  200.       err_report(e->errnum, msgs_lookup_sub1("DirFail", e->errmess));
  201.     } else
  202.       flags = 1; /* success */
  203.   } else
  204.     M("NoDirtoApp");
  205.  
  206.   if(flags == 1) {
  207.     /* N.B. Bizarrely, the underlying window may have been deleted by the time we receive a SaveAs_SaveCompleted event - so we must do our business here. */
  208.     
  209.     /* Read conversion operation from radio buttons */
  210.     if(E(radiobutton_get_state(0, blk->window_id, SAVEDIR_RADIO_TOSF3000, NULL, &blk->reset_direction)))
  211.       goto exit;
  212.  
  213.     /* Create new Scan object */
  214.     char *buf;
  215.     if(E(loader_canonicalise(&buf, NULL, NULL, save_to_file_block->filename)))
  216.       goto exit;
  217.     ObjectId batchid = Scan_create(blk->input_path, buf, blk->reset_direction == SAVEDIR_RADIO_TOSF3000);
  218.     free(buf);
  219.     if(batchid != NULL_ObjectId)
  220.       RE(toolbox_show_object(0, batchid, Toolbox_ShowObject_Centre, 0, 0, 0));
  221.   }
  222. exit:  
  223.   saveas_file_save_completed(flags, id_block->self_id, save_to_file_block->filename);
  224.   return 1; /* claim event */
  225. }
  226.  
  227. /* ----------------------------------------------------------------------- */
  228.  
  229. static int _SaveDir_deletedhandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
  230. {
  231.   SaveDirData *blk = (SaveDirData *)handle;
  232.  
  233.   /* deregister handlers */
  234.   RE(event_deregister_toolbox_handler(id_block->self_id, SaveAs_SaveToFile,  _SaveDir_savehandler, handle));
  235.   RE(event_deregister_toolbox_handler(id_block->self_id, SaveAs_DialogueCompleted,  delete_object_handler, handle));
  236.   RE(event_deregister_toolbox_handler(blk->window_id, ActionButton_Selected, _SaveDir_buttonshandler, handle));
  237.   RE(event_deregister_toolbox_handler(id_block->self_id, Toolbox_ObjectDeleted,  _SaveDir_deletedhandler, handle));
  238.  
  239.   RE(ViewsMenu_remove(id_block->self_id));
  240.  
  241.   /* free memory */
  242. #ifndef SAVEAS_CRAP
  243.   free(blk->reset_file_name);
  244. #endif
  245.   free(blk->input_path);
  246.   free(blk);
  247.  
  248.   if(last_savebox == id_block->self_id)
  249.     last_savebox = NULL_ObjectId;
  250.  
  251.   return 1; /* claim event */
  252. }
  253.  
  254.